<?php

namespace Siese\EntityBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Siese\EntityBundle\Entity\InspeccionesEntidades;
use Siese\EntityBundle\Form\InspeccionesEntidadesFemeninasType;

use Siese\EntityBundle\Form\BloqueoInspeccionesType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;

/**
 * InspeccionesEntidades controller.
 *
 */
class InspeccionesEntidadesFemeninasController extends Controller
{

    /**
     * Lists all InspeccionesEntidades entities.
     *
     */
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $servicioBloqueo = $this->container->get('siese_entity.bloqueo_inspeccion');
        $verificarBloqueo = $servicioBloqueo->verificar($this->getUser());
        $entities = null;
        
        /* Se buscan las inspecciones por el tipo de la Inspeccion (F,M) */
        $arregloFiltroBusqueda = array('tipoInspeccion' => 'F');
        $arregloFiltroBusqueda['estatus'] = array('R','P','V'); 
        
        // Si el usuario es registrador solo ve sus inspecciones
        if (true === $this->get('security.context')->isGranted('ROLE_USUARIO')):
          $arregloFiltroBusqueda['usuario'] = $this->getUser(); 
        elseif(true === $this->get('security.context')->isGranted('ROLE_DEFENSOR')):
          foreach($this->getUser()->getSedesUsuario() as $sedeUsuario):
            $sedes[] = $sedeUsuario->getSede()->getId();
          endforeach;
          $arregloFiltroBusqueda['sede'] = $sedes;
        endif;
        
        $servFiltrosBusqueda = $this->container->get('siese_entity.generar_filtros_busqueda');
        $formFiltrosBusqueda = $servFiltrosBusqueda->generarFormularioFiltros('listar-femeninas');

        if ($request->isMethod('POST')){
            
            $formFiltrosBusqueda->handleRequest($request);
            
            $resFiltrosBusqueda = $request->request->get('siese_filtros_busqueda');
            
            
            $arregloFiltroBusqueda['ano'] = $resFiltrosBusqueda['anios'];
            $arregloFiltroBusqueda['entidad'] = $resFiltrosBusqueda['entidad'];
            
            $entities = $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->findBy($arregloFiltroBusqueda);
            
            
            (!$entities ? $this->get('session')->getFlashBag()->set('warning-no-inspecciones','No existen inspecciones registradas para la busqueda realizada.') : '' );

       }
       
        return $this->render('SieseEntityBundle:InspeccionesEntidades:index_femeninas.html.twig', array(
            'entities' => $entities,
            'formFiltrosBusqueda' => $formFiltrosBusqueda->createView(),
            'verificarBloqueo' => $verificarBloqueo
        ));
    }
    

    
    /**
     * Creates a new InspeccionesEntidades entity.
     *
     */
    public function createAction(Request $request,$id = null)
    {
        $em = $this->getDoctrine()->getManager();
        $entity = ($id ? $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id) : new InspeccionesEntidades());
       
        $usuario = $this->getUser();
        $form = $this->createCreateForm($entity,$usuario);
       
        
        
        $form->handleRequest($request);
       
        $catProcedenciaPob = $em->getRepository('SieseEntityBundle:CatProcedenciaPob')->findAll();
        if ($request->getMethod() === 'POST' || $request->getMethod() === 'PUT') {
            
            $fechaActual = new \DateTime('now');
            $entity->setUsuario($usuario);
            $entity->setFeRegistro($fechaActual);
            $entity->setFeElaboracion($fechaActual);
            $entity->setAno($fechaActual->format('Y'));
            $entity->setEstadoInspeccion($form->get('estadoEnt')->getData());
            
            $entity->setEstatus('R');
            $entity->setTipoInspeccion('F');
            
            /* Servicio para generar el codigo de la inspeccion */
            $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
            $fechaActual = ($entity->getFeRegistro() ? $entity->getFeRegistro() : new \DateTime('now'));
            $servCargarRelacionesInspecciones->crearCodigoInspeccion($entity,$form,'F',$fechaActual);
            /* Servicio para generar el codigo de la inspeccion */
            
            $entity->setEntidad($form->get('entidad')->getData());
            
            $em->persist($entity);
            
            $em->flush();
            
            /* Carga de las Relaciones muchos a muchos de la entidad, todas deben 
             * ser despues del Seteo de la Entidad por eso se hace despues del
             * flush
             */
             $servCargarRelacionesInspecciones->cargarRelacionesFormularioEntidadFemenina($form,$entity,$em);
            
             $feRegistro = ($entity->getFeRegistro() ? $entity->getFeRegistro() : new \DateTime('now'));

            $this->get('session')->getFlashBag()->set('exito','La inspección N° '.$entity->getCodInspeccion().' realizada a la entidad socioeducativa '.$entity->getEntidad()->getNbEntidad().' ha sido registrada de manera exitosa.');
            return $this->redirect($this->generateUrl('listar-femeninas'));
        }

        return $this->render('SieseEntityBundle:InspeccionesEntidades:EntidadesFemeninas:new_nuevo.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
            'catProcedenciaPob' => $catProcedenciaPob
        ));
    }
    

    
    /**
    * Creates a form to create a InspeccionesEntidades entity.
    *
    * @param InspeccionesEntidades $entity The entity
    *
    * @return \Symfony\Component\Form\Form The form
    */
    private function createCreateForm(InspeccionesEntidades $entity,$usuario)
    {
        $form = $this->createForm(new InspeccionesEntidadesFemeninasType($this->getDoctrine()->getManager(),$usuario), $entity, array(
            'action' => $this->generateUrl('inspecciones-entidades-femeninas_create'),
            'method' => 'POST',
        ));

        $form->add('submit', 'submit', array('label' => 'Registrar Inspeccion',
                                             'attr' => array('class' => 'btn btn-warning')));

        return $form;
    }

    /**
     * Displays a form to create a new InspeccionesEntidades entity.
     *
     */
    public function newAction()
    {
        $entity = new InspeccionesEntidades();
        $em = $this->getDoctrine()->getManager();
        $usuario = $this->getUser();
        $form   = $this->createCreateForm($entity,$usuario);
        $catProcedenciaPob = $em->getRepository('SieseEntityBundle:CatProcedenciaPob')->findAll();
                
        
        return $this->render('SieseEntityBundle:InspeccionesEntidades/EntidadesFemeninas:new_nuevo.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
            'catProcedenciaPob' => $catProcedenciaPob
        ));
    }

    /**
     * Finds and displays a InspeccionesEntidades entity.
     *
     */
    public function showAction($id)
    {
      $em = $this->getDoctrine()->getManager();
      $servicioBloqueo = $this->container->get('siese_entity.bloqueo_inspeccion');
      $verificarBloqueo = $servicioBloqueo->verificar($this->getUser());      
        $usuario = $this->getUser();
        $entity = $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id);
        $catProcedenciaPob = $em->getRepository('SieseEntityBundle:CatProcedenciaPob')->findAll();
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find InspeccionesEntidades entity.');
        }
        
        
        $secContext = $this->get('security.context');
        $aprobacionForm = null;
        $deleteForm = null;
        
   
        
        /* Si el usuario es  REGISTRADOR, debe tener el boton "Enviar para Aprobación" */
        if (true === $secContext->isGranted('ROLE_USUARIO')) {
          $aForm = $this->createAprobacionForm($entity,$usuario);
          $dForm = $this->createDeleteForm($id); // Solo el registrador puede eliminar sus inspecciones
          
          $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
          $servCargarRelacionesInspecciones->mostrarRelacionesFormulario($entity,$aForm);

          $aprobacionForm = $aForm->createView();
          $deleteForm = $dForm->createView();
        } else {
           $aForm = $this->createAprobacionForm($entity,$usuario);

           $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
           $servCargarRelacionesInspecciones->mostrarRelacionesFormulario($entity,$aForm);           
           $aprobacionForm = $aForm->createView();
        }
        
        
        
        
        
        return $this->render('SieseEntityBundle:InspeccionesEntidades/EntidadesFemeninas:show_nuevo.html.twig', array(
            'entity'           => $entity,
            'form'             => $aprobacionForm,
            'delete_form'      => $deleteForm,
            'verificarBloqueo' => $verificarBloqueo,
           'catProcedenciaPob' => $catProcedenciaPob  ));
    }

    /**
     * Displays a form to edit an existing InspeccionesEntidades entity.
     *
     */
    public function editAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $usuario = $this->getUser();
        $entity = $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id);
        $catProcedenciaPob = $em->getRepository('SieseEntityBundle:CatProcedenciaPob')->findAll();
        
        
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find InspeccionesEntidades entity.');
        }

        $editForm = $this->createEditForm($entity,$usuario);
        
        $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
        $servCargarRelacionesInspecciones->mostrarRelacionesFormulario($entity,$editForm);
          
        $deleteForm = $this->createDeleteForm($id);

        return $this->render('SieseEntityBundle:InspeccionesEntidades/EntidadesFemeninas:edit_nuevo.html.twig', array(
            'entity'      => $entity,
            'form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
            'catProcedenciaPob' => $catProcedenciaPob,
        ));
    }

    /**
    * Creates a form to edit a InspeccionesEntidades entity.
    *
    * @param InspeccionesEntidades $entity The entity
    *
    * @return \Symfony\Component\Form\Form The form
    */
    private function createEditForm(InspeccionesEntidades $entity,$usuario)
    {
        $form = $this->createForm(new InspeccionesEntidadesFemeninasType($this->getDoctrine()->getManager(),$usuario), $entity, array(
            'action' => $this->generateUrl('inspecciones-entidades-femeninas_update', array('id' => $entity->getId())),
            'method' => 'PUT',
        ));

        $form->add('submit', 'submit', array('label' => 'Editar', 'attr' => array('class' => 'btn btn-warning')));

        return $form;
    }
    /**
     * Edits an existing InspeccionesEntidades entity.
     *
     */
    public function updateAction(Request $request, $id)
    {
        $em = $this->getDoctrine()->getManager();
        $usuario = $this->getUser();

        $entity = $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find InspeccionesEntidades entity.');
        }

        $deleteForm = $this->createDeleteForm($id);
        $editForm = $this->createEditForm($entity,$usuario);
        $editForm->handleRequest($request);

        if ($request->getMethod() === 'POST' || $request->getMethod() === 'PUT') {
            
            /* Servicio para generar el codigo de la inspeccion */
            $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
            $fechaActual = ($entity->getFeRegistro() ? $entity->getFeRegistro() : new \DateTime('now'));
            $servCargarRelacionesInspecciones->crearCodigoInspeccion($entity,$editForm,'F',$fechaActual);
            /* Servicio para generar el codigo de la inspeccion */
            
            $entity->setEstadoInspeccion($editForm->get('estadoEnt')->getData());
            $entity->setEntidad($editForm->get('entidad')->getData());
            $em->flush();
            
            $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
            $servCargarRelacionesInspecciones->cargarRelacionesFormularioEntidadFemenina($editForm,$entity,$em);


            
            $feRegistro = $entity->getFeRegistro();
            $this->get('session')->getFlashBag()->set('exito','La Inspección N° '.$entity->getCodInspeccion().' realizada a la entidad socioeducativa '.$entity->getEntidad()->getNbEntidad().' de fecha '.$feRegistro->format('d-m-Y').' a sido modificada exitosamente.');              
            return $this->redirect($this->generateUrl('listar-femeninas'));
        }

        return $this->render('SieseEntityBundle:InspeccionesEntidades/EntidadesFemeninas:edit_nuevo.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }
    /**
     * Deletes a InspeccionesEntidades entity.
     *
     */
    public function deleteAction(Request $request, $id)
    {
        $form = $this->createDeleteForm($id);
        $form->handleRequest($request);
        
        if ($request->getMethod() === 'POST' || $request->getMethod() === 'DELETE') {
            
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id);

            if (!$entity) {
              return $this->redirect($this->generateUrl('listar-femeninas'));
            }

            $entity->setEstatus('E');
            $em->persist($entity);
            $em->flush();
        }
        
        $this->get('session')->getFlashBag()->set('exito','La Inspección a sido Eliminada Exitosamente.');
        return $this->redirect($this->generateUrl('listar-femeninas'));
    }

    /**
     * Creates a form to delete a InspeccionesEntidades entity by id.
     *
     * @param mixed $id The entity id
     *
     * @return \Symfony\Component\Form\Form The form
     */
    private function createDeleteForm($id)
    {
        return $this->createFormBuilder()
            ->setAction($this->generateUrl('inspecciones-entidades-femeninas_delete', array('id' => $id)))
            ->setMethod('DELETE')
            ->add('submit', 'submit', array('label' => 'Eliminar', 'attr' => array('class' => 'btn btn-danger')))
            ->getForm()
        ;
    }
       public function municipiosPorEstadoAction(Request $request)
    {
        $estado_id = $request->request->get('estado_id');

        $em = $this->getDoctrine()->getManager();
        $municipios = $em->getRepository('SieseEntityBundle:CatMunicipios')->findByEstadoId($estado_id);

        return new JsonResponse($municipios);
    }    
    
    public function entidadesPorEstadoAction(Request $request) {
        $estado_id = $request->request->get('estado_id');

        $em = $this->getDoctrine()->getManager();
        $entities = $em->getRepository('SieseEntityBundle:Entidades')->findByEstadoId($estado_id);

        return new JsonResponse($entities); 
    }
     public function guardarDatosInsPobAction(Request $request,$id) {
        $em = $this->getDoctrine()->getManager();
        $entity = ($id != 'vacio' ? $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id) : new InspeccionesEntidades());
        
        $usuario = $this->getUser();
        $form = $this->createCreateForm($entity,$usuario);
        $form->handleRequest($request);
        
        
        
        $fechaActual = new \DateTime('now');
            
        $entity->setUsuario($usuario);
        $entity->setFeRegistro($fechaActual);
        $entity->setFeElaboracion($fechaActual);
        $entity->setAno($fechaActual->format('Y'));
        $entity->setTipoInspeccion('F');
        $entity->setEstadoInspeccion($form->get('estadoEnt')->getData());
        
        
        $entity->setEntidad($form->get('entidad')->getData());
        
        $em->persist($entity);
        $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
        $servCargarRelacionesInspecciones->cargarRelacionesFormularioEntidadFemenina($form,$entity,$em);        
        $em->flush();
        

        return new Response((integer) $entity->getId());        
    }
    
    public function editarDatosInsPobAction(Request $request,$id) {
      $em = $this->getDoctrine()->getManager();
      $entity = ($id != 'vacio' ? $em->getRepository('SieseEntityBundle:InspeccionesEntidades')->find($id) : new InspeccionesEntidades());
        
      $usuario = $this->getUser();
      $editForm = $this->createEditForm($entity,$usuario);
      $editForm->handleRequest($request);
        
      $em->persist($entity);
      $servCargarRelacionesInspecciones = $this->container->get('siese_entity.cargar_relaciones_inspecciones');
      $servCargarRelacionesInspecciones->cargarRelacionesFormularioEntidadFemenina($editForm,$entity,$em); 
      $em->flush();  
     
      return new Response((integer) $entity->getId()); 
    }
        
    /**
    * Crea el formulario para el envio de la inspección para su aprobación por
    * el Defensor
    *
    * @param InspeccionesEntidades $entity The entity
    *
    * @return \Symfony\Component\Form\Form The form
    */
    private function createAprobacionForm(InspeccionesEntidades $entity,$usuario)
    {    
        $form = $this->createForm(new InspeccionesEntidadesFemeninasType($this->getDoctrine()->getManager(),$usuario), $entity, array(
            'action' => $this->generateUrl('post_inspeccion_enviar_aprobacion', array('id' => $entity->getId(),'tipoInspeccion'=> 'entidades-femeninas')),
            'method' => 'PUT',
        ));

        if ((true === $this->get('security.context')->isGranted('ROLE_USUARIO') && $entity->getEstatus() == 'R') or ($entity->getEstatus() == 'R' && $entity->getUsuario()->getId() == $this->getUser()->getId())) {
          $form->add('submit', 'submit', array('label' => 'Culminar Registro', 'attr' => array('class' => 'btn btn-warning')));
        }
        
        return $form;
    }    
}
